package com.demo.java.OD351_400.OD372;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【最小循环子数组(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146232196
 */
public class OdMain {
    public static void main(final String[] args) {
        final Scanner scanner = new Scanner(System.in);
        final int n = Integer.parseInt(scanner.nextLine().trim());  // 读取数组长度
        final String[] input = scanner.nextLine().split(" ");  // 读取数组元素
        final List<Integer> nums = new ArrayList<>(n);

        // 将输入的数字存储到列表中
        for (int i = 0; i < n; i++) {
            nums.add(Integer.parseInt(input[i]));
        }

        // 计算next数组
        final int[] next = computeNext(nums);

        // 根据next数组计算最小的循环数组长度
        final int m = next[n - 1];  // 获取next数组最后一个元素的值
        final int length = n % (n - m) == 0 ? n - m : n;  // 如果n可以被(n - m)整除，则返回n - m，否则返回n

        // 输出结果
        for (int i = 0; i < length; i++) {
            System.out.print(nums.get(i));
            if (i < length - 1) {
                System.out.print(" ");
            }
        }
    }

    // 计算next数组
    public static int[] computeNext(final List<Integer> nums) {
        final int n = nums.size();
        final int[] next = new int[n];

        // 使用KMP算法计算next数组
        for (int j = 1, k = 0; j < n; j++) {
            while (k > 0 && !nums.get(j).equals(nums.get(k))) {
                k = next[k - 1];  // 回退
            }
            if (nums.get(j).equals(nums.get(k))) {
                k++;  // 增加匹配长度
            }
            next[j] = k;  // 更新next数组
        }

        return next;
    }
}